# www.numpy.org.cn
import numpy as np
# 自制的数据集
import dataset 
# 绘图工具库
from matplotlib import pyplot as plt

# sigmoid激活函数
def sigmoid(z):
    return 1/(1+np.exp(-z))

# 1 获取100组numpy数组随机数据
m=100
xs,ys = dataset.get_xy_dateset6(m)
# plt.subplot(121)
# plt.scatter(xs,ys)
# 第x个参数w 当前层第x个神经元 第x层隐藏层
# 第1层
# 第1个神经元
w11_1 = np.random.rand()
b1_1 = np.random.rand()
# 第2个神经元
w12_1 = np.random.rand()
b2_1 = np.random.rand()

# 第2层
w11_2 = np.random.rand()
w21_2 = np.random.rand()
b1_2 = np.random.rand()

# 前向传播
def forward_propagation(xs):
    z1_1 = w11_1*xs+b1_1
    a1_1 = sigmoid(z1_1)

    z2_1 = w12_1*xs+b2_1
    a2_1 = sigmoid(z2_1)

    z1_2 = w11_2*a1_1+w21_2*a2_1+b1_2
    a1_2 = sigmoid(z1_2)

    return a1_2,z1_2,a2_1,z2_1,a1_1,z1_1

a1_2,z1_2,a2_1,z2_1,a1_1,z1_1 = forward_propagation(xs)
plt.plot(xs,a1_2)
# plt.show()

# 下面的前向传播 反向传播看不懂的 
# 看06神经网络隐藏层.md-image2.jpg
for _ in range(5000):
    # 循环100次 依次取出数据处理
    for i in range(100):
        x = xs[i]
        y = ys[i]
        # 前向传播
        a1_2,z1_2,a2_1,z2_1,a1_1,z1_1 = forward_propagation(x)
        # 反向传播
        # 误差代价e
        # 第2层隐藏层的第1个神经元的反向传播
        e = (y-a1_2)**2
        deda1_2 = -2*(y-a1_2)
        da1_2dz1_2 = a1_2*(1-a1_2)
        dz1_2dw11_2 = a1_1
        dz1_2dw21_2 = a2_1 
        dz1_2db = 1
        dedw11_2 = deda1_2 *da1_2dz1_2 *dz1_2dw11_2
        dedw21_2 = deda1_2 *da1_2dz1_2 *dz1_2dw21_2
        dedb1_2 = deda1_2 *da1_2dz1_2 * dz1_2db

        # 第1层隐藏层的第1个神经元的反向传播
        dz1_2da1_1 = w11_2
        da1_1dz1_1 = a1_1*(1-a1_1)
        dz1_1dw11_1 = x
        dedw11_1 = deda1_2 *da1_2dz1_2 *dz1_2da1_1 *da1_1dz1_1 *dz1_1dw11_1
        dz1_1db1_1 = 1
        dedb1_1 = deda1_2 *da1_2dz1_2 *dz1_2da1_1 *da1_1dz1_1 *dz1_1db1_1

        # 第1层隐藏层的第2个神经元的反向传播
        dz1_2da2_1 = w21_2
        da2_1dz2_1 = a2_1*(1-a2_1)
        dz2_1dw12_1 = x
        dedw12_1 = deda1_2 *da1_2dz1_2 *dz1_2da2_1 *da2_1dz2_1 *dz2_1dw12_1
        dz2_1db2_1 = 1
        dedb2_1 = deda1_2 *da1_2dz1_2 *dz1_2da2_1 *da2_1dz2_1 *dz2_1db2_1

        # 学习率0.03
        alpha = 0.03
        # 反向传播后的参数调整
        w11_2 = w11_2 - alpha*dedw11_2
        w21_2 = w21_2 - alpha*dedw21_2
        b1_2 = b1_2 - alpha*dedb1_2

        w11_1 = w11_1 - alpha*dedw11_1
        b1_1 = b1_1 - alpha*dedb1_1

        w12_1 = w12_1 - alpha*dedw12_1
        b2_1 = b2_1 - alpha*dedb2_1

    if _%50 == 0:
        # 7 先清空下窗口 
        plt.clf()
        # 重新把点线画上去
        plt.scatter(xs,ys)
        a1_2s,z1_2s,a2_1s,z2_1s,a1_1s,z1_1s = forward_propgation(xs)

        plt.plot(xs,a1_2s)
        # 让图片更新没那么快 来个延时
        plt.pause(0.01)
